package file;

import java.util.BitSet;

/**
 * @author acidflow
 *
 */
public class BufferMap{
	
	private BitSet bufferMap;
	private int length;
	

	/**
	 * Crée un nouveau BufferMap 
	 */
	public BufferMap(){
		this.bufferMap = new BitSet();
	}
	
	/**
	 * Crée un nouveau BufferMap de longueur nbPieces
	 * @param nbPieces la longueur du BufferMap
	 */
	public BufferMap(int nbPieces){
		this.bufferMap = new BitSet(nbPieces);
		this.length = nbPieces;
	}
	
	
	/**
	 * @return le BufferMap
	 */
	public BitSet getBufferMap() {
		return bufferMap;
	}
	
	/**
	 * @return the length
	 */
	public final int getLength() {
		return length;
	}

	/**
	 * Set le BufferMap avec le BufferMap passé en paramètre
	 * @param bufferMap
	 */
	public void setBufferMap(BitSet bufferMap) {
		this.bufferMap = bufferMap;
	}
	
	
	/**
	 * Ajoute une pièce au BufferMap
	 * @param piece le numéro de la pièce
	 */
	public void addOnePieceToBufferMap(int piece){
		this.bufferMap.set(piece);
	}
	
	/**
	 * Retire une pièce du BufferMap
	 * @param piece le numéro de la pièce
	 */
	public void removeOnePieceFromBufferMap(int piece){
		this.bufferMap.clear(piece);
	}
	
	/**
	 * Indique si le BufferMap est complet
	 * @return vrai si le BufferMap est complet, faux sinon
	 */
	public boolean isComplete(){
		return this.bufferMap.cardinality() == this.length;
	}

	/**
	 * Converti le BufferMap en tableau d'octet pour être envoyé sur une socket
	 * @return le tableau d'octet correspondant au BufferMap
	 */
	public byte[] toByteArray(){
		int size = (int) Math.ceil((double) this.length/8);
		byte[] ret = new byte[size];
		BitSet tmp;
		for(int i = 0; i < size; i++){
			tmp = this.bufferMap.get(i*8, (i+1)*9);
			for(int j = 0; j < tmp.size(); j++){
				if(tmp.get(j))
					ret[i] |= 1 << j;
			}
		}
		return ret;
	}
	
	public void fillBufferMap(byte[] b){
		for(int i = 0; i < b.length; i++){
			for(int j = 0; j < 8; j++){
				this.bufferMap.set(i*8+j, isBitSet(b[i], j));
			}
		}
		
	}
	
	private boolean isBitSet(byte b, int bit){
	    return (b & (1 << bit)) != 0;
	}
	
}	
